/**
 * 简化的下载管理器
 */

class DownloadManager {
  constructor() {
    this.downloading = false
  }

  /**
   * 下载文件
   * @param {string} url 文件URL
   * @param {string} fileName 文件名
   * @param {Object} options 选项
   */
  async download(url, fileName, options = {}) {
    if (this.downloading) {
      throw new Error('下载正在进行中，请稍后再试')
    }

    this.downloading = true

    try {
      // 方法1: 尝试使用fetch下载（可能被CORS阻止）
      try {
        const response = await fetch(url, {
          method: 'GET',
          mode: 'cors',
          credentials: 'omit'
        })

        if (response.ok) {
          const blob = await response.blob()
          this.downloadBlob(blob, fileName)
          return
        }
      } catch (fetchError) {
        console.warn('Fetch下载失败，尝试其他方法:', fetchError.message)
      }

      // 方法2: 使用XMLHttpRequest下载
      try {
        await this.downloadWithXHR(url, fileName)
        return
      } catch (xhrError) {
        console.warn('XHR下载失败，尝试其他方法:', xhrError.message)
      }

      // 方法3: 直接链接下载（绕过CORS）
      try {
        await this.downloadDirect(url, fileName)
        return
      } catch (directError) {
        console.warn('直接下载失败，尝试最后方法:', directError.message)
      }

      // 方法4: 简单的新窗口下载（最后的备用方案）
      try {
        window.open(url, '_blank')
        return
      } catch (openError) {
        console.warn('新窗口下载失败:', openError.message)
      }

      // 方法5: iframe下载（最后的备用方案）
      await this.downloadWithIframe(url, fileName)

    } catch (error) {
      throw new Error(`所有下载方法都失败了: ${error.message}`)
    } finally {
      this.downloading = false
    }
  }

  /**
   * 使用XMLHttpRequest下载
   * @param {string} url 文件URL
   * @param {string} fileName 文件名
   * @returns {Promise<void>}
   */
  downloadWithXHR(url, fileName) {
    return new Promise((resolve, reject) => {
      const xhr = new XMLHttpRequest()
      xhr.open('GET', url, true)
      xhr.responseType = 'blob'
      xhr.withCredentials = false
      xhr.timeout = 30000

      xhr.onload = () => {
        if (xhr.status === 200) {
          const blob = xhr.response
          this.downloadBlob(blob, fileName)
          resolve()
        } else {
          reject(new Error(`XHR下载失败: ${xhr.status}`))
        }
      }

      xhr.onerror = () => {
        reject(new Error('XHR网络错误'))
      }

      xhr.ontimeout = () => {
        reject(new Error('XHR下载超时'))
      }

      xhr.send()
    })
  }

  /**
   * 直接链接下载（绕过CORS）
   * @param {string} url 文件URL
   * @param {string} fileName 文件名
   * @returns {Promise<void>}
   */
  downloadDirect(url, fileName) {
    return new Promise((resolve, reject) => {
      try {
        // 方法1: 尝试使用download属性
        const link = document.createElement('a')
        link.href = url
        link.download = fileName
        link.target = '_blank'
        link.style.display = 'none'
        
        document.body.appendChild(link)
        link.click()
        document.body.removeChild(link)
        
        // 延迟解析，给浏览器时间处理下载
        setTimeout(resolve, 100)
      } catch (error) {
        // 方法2: 如果download属性失败，直接打开链接
        try {
          window.open(url, '_blank')
          resolve()
        } catch (openError) {
          reject(new Error(`直接下载失败: ${error.message}`))
        }
      }
    })
  }

  /**
   * 使用iframe下载
   * @param {string} url 文件URL
   * @param {string} fileName 文件名
   * @returns {Promise<void>}
   */
  downloadWithIframe(url, fileName) {
    return new Promise((resolve, reject) => {
      try {
        const iframe = document.createElement('iframe')
        iframe.style.display = 'none'
        iframe.src = url
        
        iframe.onload = () => {
          setTimeout(() => {
            document.body.removeChild(iframe)
            resolve()
          }, 1000)
        }
        
        iframe.onerror = () => {
          document.body.removeChild(iframe)
          reject(new Error('iframe下载失败'))
        }
        
        document.body.appendChild(iframe)
      } catch (error) {
        reject(new Error(`iframe下载失败: ${error.message}`))
      }
    })
  }

  /**
   * 下载blob
   * @param {Blob} blob 文件blob
   * @param {string} fileName 文件名
   */
  downloadBlob(blob, fileName) {
    const blobUrl = window.URL.createObjectURL(blob)
    const link = document.createElement('a')
    link.href = blobUrl
    link.download = fileName
    link.style.display = 'none'
    
    document.body.appendChild(link)
    link.click()
    document.body.removeChild(link)
    
    // 清理blob URL
    setTimeout(() => {
      window.URL.revokeObjectURL(blobUrl)
    }, 1000)
  }

  /**
   * 获取文件名
   * @param {string} url 文件URL
   * @param {string} defaultName 默认文件名
   * @returns {string}
   */
  getFileName(url, defaultName = 'wallpaper') {
    const extension = this.getFileExtension(url)
    return `${defaultName}.${extension}`
  }

  /**
   * 获取文件扩展名
   * @param {string} url 文件URL
   * @returns {string}
   */
  getFileExtension(url) {
    const urlLower = url.toLowerCase()
    if (urlLower.includes('.jpg') || urlLower.includes('.jpeg')) return 'jpg'
    if (urlLower.includes('.png')) return 'png'
    if (urlLower.includes('.gif')) return 'gif'
    if (urlLower.includes('.webp')) return 'webp'
    if (urlLower.includes('.bmp')) return 'bmp'
    return 'jpg' // 默认
  }
}

// 创建单例实例
const downloadManager = new DownloadManager()

export default downloadManager 